home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
asmutil
/
uasm.zip
/
6805SYM.C
< prev
next >
Wrap
C/C++ Source or Header
|
1986-04-06
|
18KB
|
495 lines
/*
Custom Computer Consultants
Universal Cross Assembler
6805 Symbols
5 April 1985
*/
#include <stdio.h>
#include <uasm.h>
char *version = {"6805 Assembler -- V3.2 4/5/86\n"} ;
#define CSEG 1 /* Code Segment */
#define DSEG 2 /* Data Segment */
#define ASCII 4 /* String */
#define PAGE 5 /* Page Eject */
#define RADIX 6 /* Define Radix */
#define DB 8 /* Define Byte */
#define DS 9 /* Define Storage */
#define DW 10 /* Define Word */
#define EQU 11 /* Equate */
#define ORG 12 /* Origin */
extern int pass1 ;
extern int lbl ;
extern int i, j, k ;
extern int lnspp ;
extern int cc ;
extern int ilc ;
extern int active ;
extern int instl ;
extern int parval ;
extern int radix ;
extern int cput ;
extern int syte, sytx ;
extern unsigned unpar ;
extern unsigned ha, he, hsp ;
extern unsigned char ch ;
extern unsigned char sym ;
extern char *iptr ;
extern char segtype[] ;
extern unsigned char ib[] ;
extern unsigned char pv[] ;
extern unsigned char px[] ;
extern int pj[] ;
extern int il[] ;
extern char *pc[], *pseudo[] ;
extern int (*pp[])() ;
extern int (*ppo[])() ;
extern char ibuf[] ;
extern struct symbol symtab[] ;
#define SYMTYPE (symtab[sytx].flags&(NSEG-1))
code_seg() { return CSEG ; }
not_cseg(seg)
int seg ;
{
if( seg == DSEG ) return TRUE ;
else return FALSE ;
}
set_il()
{
il[CSEG] = 0x80 ;
il[DSEG] = 0 ;
}
set_type()
{
segtype[CSEG] = '\'' ;
segtype[DSEG] = '\"' ;
}
gen(len)
int len ;
{
ib[2] = parval & 0xFF ;
ib[1] = len == 3 ? parval >> 8 : ib[2] ;
instl = len ;
ib[0] = pv[k] ;
return TRUE ;
}
nopr() { return gen(1) ; }
immd() { if( nomatch("#") ) return FALSE ;
parval = eval() ;
return gen(2) ; }
dira() { parval = eval() ;
if( ch == ',' ) return FALSE ;
return gen(2) ; }
dorc() { parval = eval() ;
if( ch == ',' ) return FALSE ;
gen(3) ;
if( ib[1] ) return TRUE ;
ib[0] -= 0x10 ;
ib[1] = ib[2] ;
--instl ; return TRUE ; }
inx0() { if( nomatch(",X") ) return FALSE ;
return gen(1) ; }
inx1() { parval = eval() ;
if( nomatch(",X") ) return FALSE ;
return gen(2) ; }
indx() { parval = eval() ;
if( nomatch(",X") ) return FALSE ;
gen(3) ;
if( ib[1] ) return TRUE ;
ib[0] += 0x10 ;
ib[1] = ib[2] ;
--instl ; return TRUE ; }
rela() { crela(2) ;
return gen(2) ; }
crela(n)
int n ;
{
parval = eval() - ( ilc + n ) ;
if( parval > 127 || parval < -128 ) push('R') ;
}
bada() { unpar = 2 * eval() ;
if( notcomma() ) return FALSE ;
parval = eval() ;
gen(2) ;
ib[0] |= ( unpar & 0x0E ) ; return TRUE ; }
bdrl() { unpar = 2 * eval() ;
if( notcomma() ) return FALSE ;
parval = eval() ;
if( notcomma() ) return FALSE ;
gen(2) ;
ib[0] |= ( unpar & 0x0E ) ;
crela(3) ;
ib[2] = parval & 0xFF ;
instl = 3 ; return TRUE ; }
areg() { if( nomatch("A") ) return FALSE ;
return gen(1) ; }
xreg() { if( nomatch("X") ) return FALSE ;
return gen(1) ; }
#define INFO 1
#define NOINFO 0
doseg()
{
il[active] = ilc ;
ilc = il[j] ;
active = j ;
return NOINFO ;
}
dods()
{
instl = eval() ;
return NOINFO ;
}
dodw()
{
parval = eval() ;
ib[cput++] = parval >> 8 ;
ib[cput++] = parval & 0xFF ;
while ( sym == ',' ) {
getch() ;
parval = eval() ;
ib[cput++] = parval >> 8 ;
ib[cput++] = parval & 0xFF ;
}
instl = cput ;
return INFO ;
}
dodb()
{
parval = eval() ;
ib[cput++] = parval & 0xFF ;
while ( sym == ',' ) {
getch() ;
ib[cput++] = eval() & 0xFF ;
}
instl = cput ;
return INFO ;
}
doequ()
{
parval = eval() ;
if ( pass1 && (lbl == OK) ) {
symtab[syte-1].value = parval ;
symtab[syte-1].flags = active ;
}
return NOINFO ;
}
doorg()
{
parval = eval() ;
ilc = parval ;
if ( hsp == 0 ) ha = he = ilc ;
return NOINFO ;
}
dopage()
{
lnspp = 0 ;
return NOINFO ;
}
doradix()
{
radix = parval ;
return NOINFO ;
}
doascii()
{
while( isin(ch," \t") ) getch() ;
sym = ch ; getch() ;
while( ch != sym && ch != '\n' ) {
ib[cput++] = ch ;
getch() ;
}
ib[cput++] = EOS ;
instl = cput ;
return INFO ;
}
/*
build_pseudo -- build a table of pointers to pseudo-ops
*/
build_pseudo()
{
j = -1 ;
pseudo[++j] = "ASCII" ; pj[j] = ASCII ; ppo[ASCII] = doascii ;
pseudo[++j] = "CSEG" ; pj[j] = CSEG ; ppo[CSEG] = doseg ;
pseudo[++j] = "DB" ; pj[j] = DB ; ppo[DB] = dodb ;
pseudo[++j] = "DS" ; pj[j] = DS ; ppo[DS] = dods ;
pseudo[++j] = "DSEG" ; pj[j] = DSEG ; ppo[DSEG] = doseg ;
pseudo[++j] = "DW" ; pj[j] = DW ; ppo[DW] = dodw ;
pseudo[++j] = "EQU" ; pj[j] = EQU ; ppo[EQU] = doequ ;
pseudo[++j] = "ORG" ; pj[j] = ORG ; ppo[ORG] = doorg ;
pseudo[++j] = "PAGE" ; pj[j] = PAGE ; ppo[PAGE] = dopage ;
pseudo[++j] = "RADIX" ; pj[j] = RADIX ; ppo[RADIX] = doradix ;
return ++j ;
}
/*
buildopc -- build opcode definition tables
pc - opcode strings
px - index by opcode into opcode values & post processing
pv - opcode values
pp - post processing functions
*/
buildopc()
{
i = j = 0 ;
pc[i]="ADC" ; px[i++]=j ; pv[j]=0xA9 ; pp[j++]=immd ;
pv[j]=0xF9 ; pp[j++]=inx0 ;
pv[j]=0xC9 ; pp[j++]=dorc ;
pv[j]=0xD9 ; pp[j++]=indx ;
pc[i]="ADD" ; px[i++]=j ; pv[j]=0xAB ; pp[j++]=immd ;
pv[j]=0xFB ; pp[j++]=inx0 ;
pv[j]=0xCB ; pp[j++]=dorc ;
pv[j]=0xDB ; pp[j++]=indx ;
pc[i]="AND" ; px[i++]=j ; pv[j]=0xA4 ; pp[j++]=immd ;
pv[j]=0xF4 ; pp[j++]=inx0 ;
pv[j]=0xC4 ; pp[j++]=dorc ;
pv[j]=0xD4 ; pp[j++]=indx ;
pc[i]="ASL" ; px[i++]=j ; pv[j]=0x48 ; pp[j++]=areg ;
pv[j]=0x58 ; pp[j++]=xreg ;
pv[j]=0x78 ; pp[j++]=inx0 ;
pv[j]=0x38 ; pp[j++]=dira ;
pv[j]=0x68 ; pp[j++]=inx1 ;
pc[i]="ASR" ; px[i++]=j ; pv[j]=0x47 ; pp[j++]=areg ;
pv[j]=0x57 ; pp[j++]=xreg ;
pv[j]=0x77 ;